home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 January: Mac OS SDK / Dev.CD Jan 98 SDK2.toast / Development Kits (Disc 2) / Word Services SDK 1.0.8 / Writeswell Jr 1.2.3 Sources ƒ / Library Source / SearchForApp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-01-20  |  4.6 KB  |  240 lines  |  [TEXT/CWIE]

  1. #include <Aliases.h>
  2. #include "SearchForApp.h"
  3.  
  4. OSErr SearchVolForBrowser( short vRef,
  5.                             Boolean *gotItPtr,
  6.                             OSType **creators,
  7.                             short numCreators,
  8.                             FSSpecPtr specPtr,
  9.                             OSType *creatorPtr )
  10. {
  11.     short    i;
  12.     DTPBRec    dPB;
  13.     short    refNum;
  14.     Str255    name;
  15.     FInfo    fndrInfo;
  16.     OSErr    err;
  17.     char     *cP;
  18.     
  19.     *gotItPtr = false;
  20.  
  21.     cP = (char*)&dPB;
  22.  
  23.     for ( i = 0; i < sizeof( dPB ); i++ ){
  24.         *cP++ = 0;
  25.     }
  26.     
  27.     dPB.ioNamePtr = (StringPtr)NULL;
  28.     dPB.ioVRefNum = vRef;
  29.     
  30.     err = PBDTGetPath( &dPB );
  31.     if ( err )
  32.         return err;
  33.     
  34.     refNum = dPB.ioDTRefNum;
  35.     
  36.     dPB.ioCompletion = (IOCompletionUPP)NULL;
  37.     dPB.ioNamePtr = name;
  38.     
  39.     for ( i = 0; i < numCreators; i++ ){
  40.         dPB.ioFileCreator = (*creators)[ i ];
  41.         
  42.         dPB.ioIndex = 1;
  43.         
  44.         do{
  45.             err = PBDTGetAPPL( &dPB, false );
  46.             if ( err == afpItemNotFound || err == paramErr)
  47.                 break;
  48.             if ( err )
  49.                 return err;
  50.             
  51.             // We got the application info, but it is possible that the application
  52.             // has been deleted without the desktop file being updated.  Check to
  53.             // see that the file is still there.
  54.             
  55.             err = HGetFInfo( vRef, dPB.ioAPPLParID, name, &fndrInfo );
  56.             if ( !err ){
  57.                 err = FSMakeFSSpec( vRef, dPB.ioAPPLParID, name, specPtr );
  58.                 if ( err )
  59.                     return err;
  60.                 
  61.                 *creatorPtr = dPB.ioFileCreator;
  62.  
  63.                 *gotItPtr = true;
  64.                 return noErr;
  65.             }
  66.         }while( !err );    
  67.     }
  68.     
  69.     return noErr;
  70. }
  71.  
  72. OSErr LaunchTheApp( FSSpecPtr specPtr )
  73. {
  74.     OSErr        err;
  75.     Boolean        changed;
  76.     AppleEvent        launchEvent;
  77.     AppleEvent        replyEvent;
  78.     AEDesc            aliasDesc;
  79.     AEDesc            folderDesc;
  80.     FSSpec            folderSpec;
  81.     AEDesc            finderAddr;
  82.     DescType        finderSig;
  83.     AliasHandle        fAliasHdl;
  84.     AliasHandle        appAliasHdl;
  85.     AEDescList        aliasList;
  86.  
  87.     // Launch the browser by sending an Open Selection apple event to the Finder.
  88.     // We need to do this so that the process shows up in the application menu, so that
  89.     // we see zoomrects on launch, and so that the application's icon is dimmed in its
  90.     // Finder window
  91.  
  92.     // Taken from Writeswell Jr.'s LaunchSpeller in DoChecking.c
  93.  
  94.     
  95.     /* make an alias for the parent folder */
  96.     
  97.     err = FSMakeFSSpec( specPtr->vRefNum,
  98.                         specPtr->parID,
  99.                         (StringPtr)NULL,
  100.                         &folderSpec );
  101.     if ( err ){
  102.         return err;
  103.     }
  104.     
  105.     err = NewAlias( (FSSpecPtr)NULL, &folderSpec, &fAliasHdl );
  106.     if ( err ){
  107.         return err;
  108.     }
  109.  
  110.     /* Create the event to send to the Finder */
  111.     
  112.     finderSig = 'MACS';                        /* Creator code of finder; type is 'FNDR' */
  113.     err = AECreateDesc( typeApplSignature,
  114.                         (Ptr)&finderSig,
  115.                         sizeof( finderSig ),
  116.                         &finderAddr );
  117.     if ( err ){
  118.         return err;
  119.     }    
  120.                 
  121.     err = AECreateAppleEvent( kAEFinderEvents,
  122.                                 kAEOpenSelection,
  123.                                 &finderAddr,
  124.                                 kAutoGenerateReturnID,
  125.                                 kAnyTransactionID,
  126.                                 &launchEvent );
  127.     
  128.     if ( err ){
  129.         return err;
  130.     }
  131.     err = AEDisposeDesc( &finderAddr );
  132.     if ( err ){
  133.         return err;
  134.     }
  135.     
  136.     /* Insert the folder alias record as the direct object of the batch event */
  137.  
  138.     /* First make a descriptor of the alias */
  139.     HLock( (Handle) fAliasHdl );
  140.  
  141.     err = AECreateDesc( typeAlias,
  142.                         (Ptr)*fAliasHdl,
  143.                         (*fAliasHdl)->aliasSize,
  144.                         &folderDesc );
  145.  
  146.     HUnlock( (Handle) fAliasHdl );
  147.     DisposHandle( (Handle) fAliasHdl );
  148.  
  149.     if ( err ){
  150.         return err;
  151.     }    
  152.     
  153.     err = AEPutParamDesc( &launchEvent,
  154.                             keyDirectObject,
  155.                             &folderDesc );
  156.     if ( err ){
  157.         return err;
  158.     }
  159.     err = AEDisposeDesc( &folderDesc );
  160.     if ( err ){
  161.         return err;
  162.     }
  163.  
  164.     /* Put the application alias on the event */
  165.     err = NewAlias( (FSSpecPtr)NULL, specPtr, &appAliasHdl );
  166.     if ( err ){
  167.         return err;
  168.     }
  169.  
  170.     HLock( (Handle) appAliasHdl );
  171.  
  172.     err = AECreateDesc( typeAlias,
  173.                         (Ptr)*appAliasHdl,
  174.                         (*appAliasHdl)->aliasSize,
  175.                         &aliasDesc );
  176.  
  177.     HUnlock( (Handle) appAliasHdl );
  178.     DisposeHandle( (Handle)appAliasHdl );
  179.  
  180.     if ( err ){
  181.         return err;
  182.     }    
  183.  
  184.     /* Now make a list of the alias descriptor.  There is only one element in this
  185.      * list
  186.      */
  187.     
  188.     err = AECreateList( (Ptr)NULL, (Size)0, false, &aliasList );
  189.     
  190.     if ( err ){
  191.         return err;
  192.     }
  193.     
  194.     err = AEPutDesc( &aliasList, 1L, &aliasDesc );
  195.     
  196.     if ( err ){
  197.         return err;
  198.     }
  199.  
  200.     err = AEDisposeDesc( &aliasDesc );
  201.     if ( err ){
  202.         return err;
  203.     }
  204.     
  205.     err = AEPutParamDesc( &launchEvent,
  206.                             keySelection,
  207.                             &aliasList );
  208.     if ( err ){
  209.         return err;
  210.     }
  211.  
  212.     err = AEDisposeDesc( &aliasList );
  213.     if ( err ){
  214.         return err;
  215.     }
  216.  
  217.     err = AESend( &launchEvent,
  218.                     &replyEvent,
  219.                     kAEWaitReply + kAECanInteract,        /* Don't allow later switch */
  220.                     kAENormalPriority,
  221.                     1800,                                // Thirty seconds; browser can take a long time to initialize
  222.                     (AEIdleUPP)NULL,
  223.                     (AEFilterUPP)NULL );
  224.     
  225.     if ( err ){
  226.         return err;
  227.     }
  228.     err = AEDisposeDesc( &launchEvent );
  229.     if ( err ){
  230.         return err;
  231.     }
  232.     
  233.     err = AEDisposeDesc( &replyEvent );
  234.     if ( err ){
  235.         return err;
  236.     }
  237.     
  238.     return noErr;
  239. }
  240.